home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / e_v3.2a_extras / tools / eyacc / bcalc.y next >
Text File  |  1992-09-02  |  1KB  |  71 lines

  1. %{
  2.  
  3. /* calculator in E using E-Yacc:
  4.  
  5.    binary operators: + - * / % & |     (precedence in this order)
  6.    unary operators:  - ~
  7.    grouping:         ( )
  8.    assignment:       var = exp         (vars 'a' .. 'f')
  9.    values:           intnum var
  10.    exit:             Q <eof>
  11.  
  12. */
  13.  
  14. DEF vars:PTR TO LONG
  15.  
  16. %}
  17.  
  18. %start stmt
  19.  
  20. %token DIGIT LETTER QUIT
  21.  
  22. %left '|'
  23. %left '&'
  24. %left '+' '-'
  25. %left '*' '/' '%'
  26. %left UMINUS '~'
  27.  
  28. %%
  29.  
  30. stmt    : expr            { PrintF('result: \d\n> ',$1); Flush(stdout) }
  31.     | LETTER '=' expr    { IF vars=NIL THEN NEW vars[26]; vars[$1]:=$3; PrintF('> '); Flush(stdout) }
  32.     | QUIT            { CleanUp(0) }
  33.     ;
  34.  
  35. expr    : '(' expr ')'        { $$:=$2 }
  36.     | expr '+' expr        { $$:=$1+$3 }
  37.     | expr '-' expr        { $$:=$1-$3 }
  38.     | expr '*' expr        { $$:=$1*$3 }
  39.     | expr '/' expr        { $$:=$1/$3 }
  40.     | expr '%' expr        { $$:=Mod($1,$3) }
  41.     | expr '|' expr        { $$:=$1 OR $3 }
  42.     | expr '&' expr        { $$:=$1 AND $3 }
  43.     | '~' expr        { $$:=Not($2) }
  44.     | '-' expr %prec UMINUS    { $$:=-$2 }
  45.     | LETTER        { $$:=vars[$1] }
  46.     | number
  47.     ;
  48.  
  49. number    : DIGIT            { $$:=$1 }
  50.     | number DIGIT        { $$:=10*$1+$2 }
  51.     ;
  52.  
  53. %%
  54.  
  55. PROC yylex()
  56.   DEF c
  57.   WHILE (c:=FgetC(stdin))=" " DO NOP
  58.   IF c="\n" THEN RETURN 0
  59.   IF (c="Q") OR (c=-1) THEN RETURN QUIT
  60.   IF (c>="a") AND (c<="z") THEN RETURN LETTER,c-"a"
  61.   IF (c>="0") AND (c<="9") THEN RETURN DIGIT,c-"0"
  62. ENDPROC c
  63.  
  64. PROC yyerror(n)
  65.   IF n=YYERRSTACK
  66.     PrintF('parse stack overflow!\n> ')
  67.   ELSEIF n=YYERRPARSE
  68.     PrintF('parse error!\n> ')
  69.   ENDIF
  70. ENDPROC
  71.